<?php

/*
 * This file is part of SwiftMailer. (c) 2004-2009 Chris Corbyn For the full copyright and license information, please view the LICENSE file that was distributed with this source code.
 */

/**
 * Interface for the EventDispatcher which handles the event dispatching layer.
 * 
 * @package Swift
 * @subpackage Events
 * @author Chris Corbyn
 */
interface Swift_Events_EventDispatcher {
	/**
	 * Create a new SendEvent for $source and $message.
	 * 
	 * @param Swift_Transport $source        	
	 * @param
	 *        	Swift_Mime_Message
	 * @return Swift_Events_SendEvent
	 */
	public function createSendEvent(Swift_Transport $source, Swift_Mime_Message $message);
	
	/**
	 * Create a new CommandEvent for $source and $command.
	 * 
	 * @param Swift_Transport $source        	
	 * @param string $command
	 *        	That will be executed
	 * @param array $successCodes
	 *        	That are needed
	 * @return Swift_Events_CommandEvent
	 */
	public function createCommandEvent(Swift_Transport $source, $command, $successCodes = array());
	
	/**
	 * Create a new ResponseEvent for $source and $response.
	 * 
	 * @param Swift_Transport $source        	
	 * @param string $response        	
	 * @param boolean $valid
	 *        	If the response is valid
	 * @return Swift_Events_ResponseEvent
	 */
	public function createResponseEvent(Swift_Transport $source, $response, $valid);
	
	/**
	 * Create a new TransportChangeEvent for $source.
	 * 
	 * @param Swift_Transport $source        	
	 * @return Swift_Events_TransportChangeEvent
	 */
	public function createTransportChangeEvent(Swift_Transport $source);
	
	/**
	 * Create a new TransportExceptionEvent for $source.
	 * 
	 * @param Swift_Transport $source        	
	 * @param Swift_TransportException $ex        	
	 * @return Swift_Events_TransportExceptionEvent
	 */
	public function createTransportExceptionEvent(Swift_Transport $source, Swift_TransportException $ex);
	
	/**
	 * Bind an event listener to this dispatcher.
	 * 
	 * @param Swift_Events_EventListener $listener        	
	 */
	public function bindEventListener(Swift_Events_EventListener $listener);
	
	/**
	 * Dispatch the given Event to all suitable listeners.
	 * 
	 * @param Swift_Events_EventObject $evt        	
	 * @param string $target
	 *        	method
	 */
	public function dispatchEvent(Swift_Events_EventObject $evt, $target);
}
